"""多继承方法执行顺序
父类 A
子类 AA BB 继承A
孙子类 AABB 继承AA，BB

调用父类方法的三种形式：
    1. 使用父类名调用父类方法在多继承中会重复调用父类方法浪费资源
    2. 使用super()调用父类方法根据__mro__属性返回元素顺序调用,解决父类方法被调用多次的问题
    3. 使用super(类名,self)调用,如果类名传当前类名和super()相同，但是类名可以传任何值即可以实现越级调用父类
"""


class A(object):

    def __init__(self, name) -> None:
        print("开始调用A的init方法")
        self.name = name
        print("结束调用A的init方法")


class AA(A):
    def __init__(self, name) -> None:
        print("开始调用AA的init方法")
        # 使用父类调用父类的init方法
        # A.__init__(self, name)
        # 使用super()调用
        # super().__init__(name)
        super(AA, self).__init__(name)
        print("结束调用AA的init方法")


class BB(A):
    def __init__(self, name) -> None:
        print("开始调用BB的init方法")
        # A.__init__(self, name)
        # super().__init__(name)
        super(BB, self).__init__(name)
        print("结束调用BB的init方法")


# 使用父类名调用父类的方法，会多次调用父类方法浪费资源
class AABB(AA, BB):
    def __init__(self, name) -> None:
        print("开始调用AABB的init方法")
        # AA.__init__(self, name)
        # BB.__init__(self, name)
        # super().__init__(name)

        # super(AABB, self).__init__(name) 传入当前类名和super()用法相同
        # 此处传入BB类，直接调用BB的父类方法
        super(BB, self).__init__(name)
        print("结束调用AABB的init方法")


def main():
    aabb = AABB("fauks")

    """__mro__返回元组，顺序决定使用super().方法调用顺序
    (<class '__main__.AABB'>, 
    <class '__main__.AA'>, 
    <class '__main__.BB'>, 
    <class '__main__.A'>, 
    <class 'object'>)
    """
    print(AABB.__mro__)


if __name__ == '__main__':
    main()
